/***********************************************************************************
 * 文件名： PY32_Config.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		PY32 驱动配置文件。
***********************************************************************************/
#ifndef _PY32_CONFIG_H_
#define _PY32_CONFIG_H_

/////////////////////////////////////////////////////////////////////////////////////
// 外设的初始参数配置，调用相应的初始化函数后将按照以下参数进行初始化，如需运行过程中修改参数
// 调用对应驱动的API即可。对于不使用的外设（不调用Init函数）可以不必理会其配置参数。
/////////////////////////////////////////////////////////////////////////////////////

//////////////////////// APP 起始地址 SystemInit
// 本软件在FLASH中保存的起始地址(相对地址、偏移)
// 如果OTA升级(存在BootLoader)，用户程序起始地址可能不为0，必须修改实际的起始地址，
// 这会影响中断向量表地址寄存器（VTOR），和Flash的读写操作。
// 与实际不符会导致中断无法响应、跑飞！！！
#define APP_BASE    0

//////////////////////// 时钟配置（Mcu_Init）

#define HSE_VALUE   (8000000) /*!< Value of the External oscillator in Hz */

#define HSI_DIV     0    // HSI分频比 = 2^HSI_DIV, 0~7,  PY32F002B 的HSI为24M

/**
 * 0 - HSI
 * 1 - HSE
 * 2 - HSI-PLL
 * 3 - HSE-PLL
*/
#define SYSCLK_SRC  0

#if (SYSCLK_SRC == 2 || SYSCLK_SRC == 3)
    #define PLL_MUL     6
#endif

/**
 *  IO接口时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_IOPENR_GPIOAEN, RCC_IOPENR_GPIOBEN, RCC_IOPENR_GPIOCEN
*/
#define RCC_IOP_PERIPH_CLKEN    RCC_IOPENR_GPIOAEN|RCC_IOPENR_GPIOBEN|RCC_IOPENR_GPIOCEN

/**
 *  AHB外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_AHBENR_FLASHEN, RCC_AHBENR_SRAMEN, RCC_AHBENR_CRCEN
 * @note SRAM 和 FLASH 时钟配置为0后将在休眠后关闭。
*/
#define RCC_AHB_PERIPH_CLKEN    RCC_AHBENR_FLASHEN|RCC_AHBENR_SRAMEN

/**
 *  APB1外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_APBENR1_I2CEN, RCC_APBENR1_DBGEN, RCC_APBENR1_PWREN,
 *          RCC_APBENR1_LPTIMEN
*/
#define RCC_APB1_PERIPH_CLKEN   RCC_APBENR1_PWREN|RCC_APBENR1_DBGEN

/**
 *  APB2外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_APBENR2_SYSCFGEN, RCC_APBENR2_TIM1EN, RCC_APBENR2_SPI1EN,
 *          RCC_APBENR2_USART1EN, RCC_APBENR2_TIM14EN, RCC_APBENR2_ADCEN,
 *          RCC_APBENR2_COMP1EN, RCC_APBENR2_COMP2EN
*/
#define RCC_APB2_PERIPH_CLKEN   RCC_APBENR2_SYSCFGEN|RCC_APBENR2_USART1EN|RCC_APBENR2_ADCEN|\
                                RCC_APBENR2_TIM1EN


//////////////////////// SysTick 的配置(调用 Mcu_TickStart 后生效)

#define SYSTICK_PERIOD          10000           // 周期，us


/////////////////////// GPIO初始配置 Gpio_Init()

// 初始输出寄存器值

#define _GPIO_PA_ODR    0x00
#define _GPIO_PB_ODR    0x00
#define _GPIO_PC_ODR    0x00

// 初始模式，0：输入，1：输出，2：复用，3：模拟

#define _GPIO_PA0_MODE  0
#define _GPIO_PA1_MODE  1
#define _GPIO_PA2_MODE  2   // SWCLK复用
#define _GPIO_PA3_MODE  1
#define _GPIO_PA4_MODE  3
#define _GPIO_PA5_MODE  0
#define _GPIO_PA6_MODE  3
#define _GPIO_PA7_MODE  3

#define _GPIO_PB0_MODE  3
#define _GPIO_PB1_MODE  3
#define _GPIO_PB2_MODE  3
#define _GPIO_PB3_MODE  3
#define _GPIO_PB4_MODE  3
#define _GPIO_PB5_MODE  3
#define _GPIO_PB6_MODE  2   // SWDIO复用
#define _GPIO_PB7_MODE  3

#define _GPIO_PC0_MODE  2   // SWDIO复用（选项字节）
#define _GPIO_PC1_MODE  3

// 复用功能选择

#define _GPIO_PA0_AFSEL     GPIO_PA0_AF2_TIM1_CH1
#define _GPIO_PA1_AFSEL     GPIO_PA1_AF0_SPI_MISO
#define _GPIO_PA2_AFSEL     GPIO_PA2_AF0_SWCLK
#define _GPIO_PA3_AFSEL     0
#define _GPIO_PA4_AFSEL     0
#define _GPIO_PA5_AFSEL     GPIO_PA5_AF2_TIM1_CH1
#define _GPIO_PA6_AFSEL     0
#define _GPIO_PA7_AFSEL     0

#define _GPIO_PB0_AFSEL     GPIO_PB0_AF0_SPI_SCK
#define _GPIO_PB1_AFSEL     0
#define _GPIO_PB2_AFSEL     0
#define _GPIO_PB3_AFSEL     0
#define _GPIO_PB4_AFSEL     0
#define _GPIO_PB5_AFSEL     0
#define _GPIO_PB6_AFSEL     GPIO_PB6_AF0_SWDIO
#define _GPIO_PB7_AFSEL     0

#define _GPIO_PC0_AFSEL     0
#define _GPIO_PC1_AFSEL     0

// 开漏输出，1：开漏输出，0：推挽输出

#define _GPIO_PA_EN_OD  0X00
#define _GPIO_PB_EN_OD  0X00
#define _GPIO_PC_EN_OD  0X00

// 输出速度，0~3

#define _GPIO_PA0_SPEED     0
#define _GPIO_PA1_SPEED     0
#define _GPIO_PA2_SPEED     0
#define _GPIO_PA3_SPEED     3
#define _GPIO_PA4_SPEED     0
#define _GPIO_PA5_SPEED     3
#define _GPIO_PA6_SPEED     0
#define _GPIO_PA7_SPEED     0

#define _GPIO_PB0_SPEED     0
#define _GPIO_PB1_SPEED     0
#define _GPIO_PB2_SPEED     0
#define _GPIO_PB3_SPEED     0
#define _GPIO_PB4_SPEED     0
#define _GPIO_PB5_SPEED     0
#define _GPIO_PB6_SPEED     3       // SWDIO
#define _GPIO_PB7_SPEED     0

#define _GPIO_PC0_SPEED     3       // SWDIO（选项字节）
#define _GPIO_PC1_SPEED     0

// 上下拉电阻，0：无，1：上拉，2：下拉。

#define _GPIO_PA0_PUPD      0
#define _GPIO_PA1_PUPD      0
#define _GPIO_PA2_PUPD      2       // SWCLK 上电默认 2
#define _GPIO_PA3_PUPD      0
#define _GPIO_PA4_PUPD      0
#define _GPIO_PA5_PUPD      0
#define _GPIO_PA6_PUPD      0
#define _GPIO_PA7_PUPD      0

#define _GPIO_PB0_PUPD      0
#define _GPIO_PB1_PUPD      0
#define _GPIO_PB2_PUPD      0
#define _GPIO_PB3_PUPD      0
#define _GPIO_PB4_PUPD      0
#define _GPIO_PB5_PUPD      0
#define _GPIO_PB6_PUPD      1       // SWDIO 默认上拉
#define _GPIO_PB7_PUPD      0

#define _GPIO_PC0_PUPD      1       // SWDIO 默认上拉
#define _GPIO_PC1_PUPD      0



/////////////////////// Uart 初始配置

#define _UART_EN            1   // 1: uart使能
#define _UART_BAUD          115200
#define _UART_HALFDUPLEX    0   // *1: 半双工，TX和RX在芯片内部互联。无官方示例。
#define _UART_RXNEIE        1   // 接收缓存非空（收到数据）中断，1：开启
#define _UART_TCIE          0   // 发送完毕中断，1：开启
#define _UART_TXEIE         0   // 发送缓存空中断，1：开启，注意，数据只是被送到了移位寄存器还未发出去


/////////////////////// Adc 初始配置 Adc_Init
/*
    扫描模式默认开启,每次开始转换将依次转换所有开启的通道(从0到9),需要注意,当前通道数据读出后才会开始下一个通道转换.
*/

#define _ADC_CLK_SOURCE     0   // 0:PCLK，1：HSI（未测试）
#define _ADC_CLK_DIV        2   // 0~6: (2^N)分频
#define _ADC_SMP            7   // ADC采样周期。0~7分别代表：3.5 5.5 7.5 13.5 28.5 41.5 71.5 239.5 时钟周期
#define _ADC_CHSEL          0b1000000001 // 每个位为1代表开启对应通道，CH8是内部温度传感器，CH9是内部1.2V基准电压
#define _ADC_EN             1   // 1：使能ADC,同时开启了VREF，温度传感器


/////////////////////// TIM1 初始配置 AdvTim_Init
// 默认为向上计数定时器

#define _TIM1_PSC       0   // 0~0XFFFF预分频，计数器的时钟频率（CK_CNT）等于fCK_PSC/( PSC[15:0]+1)。
#define _TIM1_ARR       0XFFFF  // 0~0XFFFF自动重装载的值
#define _TIM1_RUN       0   // 1: 初始化后开始运行

#define _TIM1_DTG       0   // 比较输出死区持续时间
#define _TIM1_OSSI      0   // 比较输出空闲模式下“关闭状态”选择,该位用于当 MOE=0 且通道设为输出时。
#define _TIM1_OSSR      0   // 比较输出运行模式下“关闭状态”选择,该位用于当 MOE=1 且通道为互补输出时。
#define _TIM1_MOE       0   // 1：主输出使能,如果设置了相应的使能位（TIM1_CCER 寄存器的CcxE、 CcxNE 位），则开启 OC 和OCN 输出。0：禁止 OC 和 OCN 输出或强制为空闲状态。

#define _TIM1_UIE       0   // 1：允许更新中断
#define _TIM1_CC1IE     0   // 1: 允许捕获/比较 1 中断
#define _TIM1_CC2IE     0   // 1: 允许捕获/比较 2 中断
#define _TIM1_CC3IE     0   // 1: 允许捕获/比较 3 中断
#define _TIM1_CC4IE     0   // 1: 允许捕获/比较 4 中断
#define _TIM1_COMIE     0   // 1: 允许 COM 中断
#define _TIM1_TIE       0   // 1: 允许触发中断
#define _TIM1_BIE       0   // 1: 允许刹车中断

#define _TIM1_CC1S      1   // 0：CC1 通道被配置为输出；1:CC1 通道被配置为输入，IC1 映射在 TI1 上; 2:CC1 通道被配置为输入，IC1 映射在 TI2 上；3: CC1 通道被配置为输入，IC1 映射在 TRC 上。 
#define _TIM1_CC1E      0   // 通道1比较输出/捕获输入使能
#define _TIM1_CC1P      0   // 通道1极性，捕获输入模式下[CC1NP,CC1P]决定极性：00：不反相/上升沿，01：反相/下降沿，11：不反相/双沿
#define _TIM1_CC1NE     0   // 通道1互补输出使能
#define _TIM1_CC1NP     0   // 通道1互补极性
#define _TIM1_CCR1      0   /* 比较输出比较值*/
#define _TIM1_OIS1      0   // 比较输出空闲状态 1(OC1 输出)。0：当 MOE=0 时，如果实现了 OC1N，则死区后 OC1=0
#define _TIM1_OIS1N     0   /* 比较输出空闲状态 1(OC1N 输出)。0：当 MOE=0 时，死区后 OC1N=0*/
#if (_TIM1_CC1S == 0)
    #define _TIM1_OC1FE     0   // 输出比较快速使能
    #define _TIM1_OC1PE     0   // 0: 禁止 TIM1_CCR1 寄存器的预装载功能，可随时写入TIM1_CCR1 寄存器，且新值马上起作用。1：开启 TIM1_CCR1 寄存器的预装载功能，读写操作仅对预装载寄存器操作， TIM1_CCR1 的预装载值在更新事件到来时被载入当前寄存器中。
    #define _TIM1_OC1M      0   // 输出比较模式 0~7
    #define _TIM1_OC1CE     0   /* 0： OC1REF 不受 ETRF 输入的影响；1：一旦检测到 ETRF 输入高电平，清除 OC1REF=0。*/
#else
    #define _TIM1_IC1PSC    0   // 0：捕获输入无预分频器，检测到的每一个边沿都触发一次捕获；
    #define _TIM1_IC1F      0   /*0: 捕获输入无滤波器，以 fDTS 采样*/ 
#endif

#define _TIM1_CC2S      1   
#define _TIM1_CC2E      0   // 通道2输出/输入使能
#define _TIM1_CC2P      0   // 通道2极性，[CC1NP,CC1P]决定输入模式下的极性：00：不反相/上升沿，01：反相/下降沿，11：不反相/双沿
#define _TIM1_CC2NE     0   // 通道2互补输出使能
#define _TIM1_CC2NP     0   // 通道2互补极性
#define _TIM1_CCR2      0   /* 输出比较值*/
#define _TIM1_OIS2      0   
#define _TIM1_OIS2N     0
#if (_TIM1_CC2S == 0)
    #define _TIM1_OC2FE     0   
    #define _TIM1_OC2PE     0   
    #define _TIM1_OC2M      0   
    #define _TIM1_OC2CE     0   
#else
    #define _TIM1_IC2PSC    0   
    #define _TIM1_IC2F      0   
#endif

#define _TIM1_CC3S      1   
#define _TIM1_CC3E      0   // 通道3输出/输入使能
#define _TIM1_CC3P      0   // 通道3极性，[CC1NP,CC1P]决定输入模式下的极性：00：不反相/上升沿，01：反相/下降沿，11：不反相/双沿
#define _TIM1_CC3NE     0   // 通道3互补输出使能
#define _TIM1_CC3NP     0   // 通道3互补极性
#define _TIM1_CCR3      0   /*比较值*/
#define _TIM1_OIS3      0
#define _TIM1_OIS3N     0
#if (_TIM1_CC3S == 0)
    #define _TIM1_OC3FE     0   
    #define _TIM1_OC3PE     0   
    #define _TIM1_OC3M      0   
    #define _TIM1_OC3CE     0   

#else
    #define _TIM1_IC3PSC    0   
    #define _TIM1_IC3F      0   
#endif

#define _TIM1_CC4S      1   
#define _TIM1_CC4E      0   // 通道4输出/输入使能
#define _TIM1_CC4P      0   // 通道4极性，[CC1NP,CC1P]决定输入模式下的极性：00：不反相/上升沿，01：反相/下降沿，11：不反相/双沿
#define _TIM1_CC4NE     0   // 通道4互补输出使能
#define _TIM1_CC4NP     0   // 通道4互补极性
#define _TIM1_CCR4      0   /*比较值*/
#define _TIM1_OIS4      0
#if (_TIM1_CC4S == 0)
    #define _TIM1_OC4FE     0   
    #define _TIM1_OC4PE     0   
    #define _TIM1_OC4M      0   
    #define _TIM1_OC4CE     0   

#else
    #define _TIM1_IC4PSC    0   
    #define _TIM1_IC4F      0   
#endif


#endif
